package com.nio;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.LinkedList;

public class SocketNIO {

    public static void main(String[] args) throws IOException, InterruptedException {
        LinkedList<SocketChannel> clients = new LinkedList();
        ServerSocketChannel ss = ServerSocketChannel.open();
        ss.bind(new InetSocketAddress(9090));
        ss.configureBlocking(false);

        while (true){
            Thread.sleep(1000);
            SocketChannel client = ss.accept(); // 非阻塞    -1   NULL
            //accept 调用内核了：
            //      1.没有客户端进来了，返回值，在BIO的时候这里会一直阻塞，但是在NIO，会直接返回-1
            //      2.有客户端进来了，accept返回的是客户端的fs(文件描述符)
            // NOBLOCKING 就是代码能往下走了，只不过有不同的情况。

            if (client == null){
                System.out.println("null");
            }else {
                client.configureBlocking(false);  //在BIO中，
                int port = client.socket().getPort();
                System.out.println("client...port: "+port);
                clients.add(client);
            }

            ByteBuffer buffer = ByteBuffer.allocate(4096);

            //遍历已连接进来的客户端能不能读写数据
            for (SocketChannel c : clients) {   //串行化，多线程。
                int num = c.read(buffer);   // >0 有数据，  返回-1 没有数据，不阻塞。
                if(num>0){
                    buffer.flip();
                    byte[] aaa =  new byte[buffer.limit()];
                    buffer.get(aaa);

                    String b = new String(aaa);
                    System.out.println(c.socket().getPort()+" : "+b);
                    buffer.clear();
                }
            }
        }
    }
}
